/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package conjuntosdifusos;

import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author D4y4
 */
public class operaciones {

    private int filas;

    private int columnas;

    public operaciones() {

    }

    public int[][] matrizA(int[][] matriz) {
        int[][] matrizA = new int[filas][columnas];
        for (int i = 0; i < filas; i++) {
            for (int j = 0; j < columnas; j++) {
                int aleatorio = (int) (Math.random() * (100 - (1)) + (10));
                matriz[i][j] = aleatorio;
            }
        }
        return matriz;
    }

    public void setValoresMatrizTableModel(String[][] matriz, DefaultTableModel mitableModel, int filas, int col) {
        mitableModel.setNumRows(filas);
        mitableModel.setColumnCount(col);
        for (int i = 0; i < filas; i++) {
            for (int j = 0; j < col; j++) {
                mitableModel.setValueAt(matriz[i][j], i, j);
            }
        }
    }

    public String[][] getValoresTableModel(JTable jTableInfo, int filas, int col) {

        String[][] matrizRetorno = new String[filas][col];
        for (int i = 0; i < filas; i++) {
            for (int j = 0; j < col; j++) {
                matrizRetorno[i][j] = (String) jTableInfo.getValueAt(i, j);
            }
        }
        return matrizRetorno;
    }

    public void setValoresComboBox(JComboBox cmb, String[] info) {

        for (int i = 0; i < info.length; i++) {

            cmb.addItem(info[i]);
        }
    }
//Verifica si es numero

    public boolean isNumeric(String cadena) {
        try {
            Double.parseDouble(cadena);
            return true;
        } catch (NumberFormatException nfe) {
            return false;
        }
    }
//verifica que el numerador y denominador esten dentro del rango 

    public boolean verificarSubIndiceX(String subconjuntoX, int tipo) {
        int valorPermitido = 1;
        boolean verificar = true;

        String[] indiceSubconjuntos = subconjuntoX.split("/");//Indice superior =0,inferior=1
        if (indiceSubconjuntos.length == 2) {
            if (isNumeric(indiceSubconjuntos[tipo])) {//Cuando ingresen valores q no sean numericos
                double valorSubIndi = Double.parseDouble(indiceSubconjuntos[tipo]);
                if (tipo == 0 && !(valorSubIndi <= valorPermitido && valorSubIndi >= 0)) {//Indice superior veririfcar q sea menor q uno
                    return false;

                } else if (tipo == 1 && !(valorSubIndi >= 0)) {//indice inferiro
                    return false;

                }
            } else {
                return false; //es una letra

            }
        } else {
            return false; //cuando los valores son ingresados mal 
//ejemplo 1/ ; 1/2;1
        }

        return verificar;
    }
//verifica cada  elemento del conjunto; umerador y denominador

    public boolean verificarCadenas(String cadenaConjunto) {
        cadenaConjunto = cadenaConjunto.trim();
        String[] subconjuntos = cadenaConjunto.split(";");
        boolean verificar = true;

        for (int i = 0; i < subconjuntos.length; i++) {
            String datoSubConjuntoIndiceX = subconjuntos[i];
            boolean verificarSuperior = verificarSubIndiceX(datoSubConjuntoIndiceX, 0);
            boolean verificarInferior = verificarSubIndiceX(datoSubConjuntoIndiceX, 1);
            if (!verificarSuperior || !verificarInferior) {
                return false;

            }

        }

        return verificar;
    }
//devuelve la fila donde existe error

    public int verificarValuesMatrizConjunto(JTable jTableInfo, int filas, int cols) {
        String[][] matrizConjunto = getValoresTableModel(jTableInfo, filas, cols);
        int filaMala = -1;
        for (int i = 0; i < filas; i++) {
            {
                for (int j = 1; j < cols; j++) {
                    String ValorDescripcionX = matrizConjunto[i][j];
                    if (!verificarCadenas(ValorDescripcionX)) {
                        filaMala = i;
                        return filaMala;
                    }
                }
            }
        }
        return filaMala;
    }

    public String complementoConjuntoX(String datosConjuntos) {
        datosConjuntos = datosConjuntos.trim();
        String[] subconjunto = datosConjuntos.split(";");
        String respuesta = "";
        double sumaConjuntoFraccion = 0;
        for (int i = 0; i < subconjunto.length; i++) {
            String datoSubconjuto = subconjunto[i];
            datoSubconjuto = datoSubconjuto.trim();
            String[] subconjuntoFraccion = datoSubconjuto.split("/");
//            (Math.rint(0.891*100)/100
            sumaConjuntoFraccion = 1 - Double.parseDouble(subconjuntoFraccion[0]);//parte superior get data
            respuesta += Math.rint(sumaConjuntoFraccion * 100) / 100 + "/" + subconjuntoFraccion[1] + ";";
        }
        return respuesta;
    }

    public String ComplementoConjuntoX(int posComplemento, String[][] MatrizInfo, int filas) {
        String respuesta = "";
        String dato = MatrizInfo[posComplemento][1];
        respuesta = complementoConjuntoX(dato) + ";";
        return respuesta;
    }

    public String ComplementoConjuntoXResultado(String posComplemento) {
        String respuesta = "";
        String dato = posComplemento;
        respuesta = complementoConjuntoX(dato) + ";";
        return respuesta;
    }
//UNION DE CONJUNTO X CON CONJUNTOY

    public String setAsingar(String[] conjuntoY, String datoSubconjutoX, boolean pasa) {
        String[] subconjuntoX = datoSubconjutoX.split("/");
        datoSubconjutoX = datoSubconjutoX.trim();
        String resultado = subconjuntoX[0] + "/" + subconjuntoX[1];

        for (int i = 0; i < conjuntoY.length; i++) {
            String datoSubconjutoY = conjuntoY[i];
            String[] subconjuntoY = datoSubconjutoY.split("/");
            if (subconjuntoX[1].equals(subconjuntoY[1])) {
                if (pasa) {
                    int longitudX = subconjuntoX[0].length();
                    int longitudY = subconjuntoY[0].length();
                    if (longitudX <= 3) {
                        numX = 10;
                    }
                    if (longitudY <= 3) {
                        numY = 10;

                    }
                    double ressubconjuntoX = Double.parseDouble(subconjuntoX[0]) * numX;
                    double ressubconjuntoY = Double.parseDouble(subconjuntoY[0]) * numY;
                    if (ressubconjuntoX >= ressubconjuntoY) {
                        resultado = subconjuntoX[0] + "/" + subconjuntoX[1];

                        return resultado;

                    } else if (ressubconjuntoY >= ressubconjuntoX) {
                        resultado = subconjuntoY[0] + "/" + subconjuntoX[1];
                        return resultado;

                    }

                } else {
                    return "1";
                }

            }
        }

        return resultado;
    }
//    INTERSECCION CONJUNTO X C0NJUNTO Y

    public String setAsingarInterseccion(String[] conjuntoY, String datoSubconjutoX) {
        String[] subconjuntoX = datoSubconjutoX.split("/");
        datoSubconjutoX = datoSubconjutoX.trim();
        String resultado = "0";

        for (int i = 0; i < conjuntoY.length; i++) {
            String datoSubconjutoY = conjuntoY[i];
            String[] subconjuntoY = datoSubconjutoY.split("/");

            if (subconjuntoX[1].equals(subconjuntoY[1])) {
                int longitudX = subconjuntoX[0].length();
                int longitudY = subconjuntoY[0].length();
                if (longitudX <= 3) {
                    numX = 10;
                }
                if (longitudY <= 3) {
                    numY = 10;

                }
                double ressubconjuntoX = Double.parseDouble(subconjuntoX[0]) * numX;
                double ressubconjuntoY = Double.parseDouble(subconjuntoY[0]) * numY;
                if (ressubconjuntoX <= ressubconjuntoY) {
                    resultado = subconjuntoX[0] + "/" + subconjuntoX[1];

                    return resultado;

                } else if (ressubconjuntoY <= ressubconjuntoX) {
                    resultado = subconjuntoY[0] + "/" + subconjuntoX[1];

                    return resultado;

                }

            }
        }

        return resultado;
    }
    int numX = 100;
    int numY = 100;

    public String setAsingarProducto(String[] conjuntoY, String datoSubconjutoX) {
        String[] subconjuntoX = datoSubconjutoX.split("/");
        datoSubconjutoX = datoSubconjutoX.trim();
        String resultado = "";

        for (int i = 0; i < conjuntoY.length; i++) {
            String datoSubconjutoY = conjuntoY[i];
            String[] subconjuntoY = datoSubconjutoY.split("/");
            int longitudX = subconjuntoX[0].length();
            int longitudY = subconjuntoY[0].length();
            if (longitudX <= 3) {
                numX = 10;
            }
            if (longitudY <= 3) {
                numY = 10;

            }
            double ressubconjuntoX = Double.parseDouble(subconjuntoX[0]) * numX;
            double ressubconjuntoY = Double.parseDouble(subconjuntoY[0]) * numY;
            if (ressubconjuntoX <= ressubconjuntoY) {
                resultado += subconjuntoX[0] + "/" + "(" + subconjuntoX[1] + "," + subconjuntoY[1] + ")" + " ;";

            } else if (ressubconjuntoY <= ressubconjuntoX) {
                resultado += subconjuntoY[0] + "/" + "(" + subconjuntoX[1] + "," + subconjuntoY[1] + ")" + " ;";

            }

        }

        return resultado;
    }

//    ConjuntoXUConjuntoY
    public String getValuesNoencontrados(String xuy, String conjuntoY) {

        String[] subconjuntos = xuy.split(";");

        String[] subconjuntosY = conjuntoY.split(";");
        String respuesta = "";
        String respuestaAux = "";

        for (int i = 0; i < subconjuntosY.length; i++) {
            String datoSubconjutoY = subconjuntosY[i];
            datoSubconjutoY = datoSubconjutoY.trim();
            respuestaAux = setAsingar(subconjuntos, datoSubconjutoY, false);
            if (!respuestaAux.equals("1")) {

                respuesta += respuestaAux + ";";
                numX = 100;
                numY = 100;
            }
        }
        return respuesta;
    }
    public String[] Escogidos;

    public String getUnionConjuntoXUY(String conjuntoX, String ConjuntoY) {
        String respuesta = "";

        conjuntoX = conjuntoX.trim();
        String[] subconjuntosX = conjuntoX.split(";");
        ConjuntoY = ConjuntoY.trim();

        String[] subconjuntosY = ConjuntoY.split(";");
        for (int i = 0; i < subconjuntosX.length; i++) {
            String datoSubconjutoX = subconjuntosX[i];
            datoSubconjutoX = datoSubconjutoX.trim();
            respuesta += setAsingar(subconjuntosY, datoSubconjutoX, true) + ";";
            numX = 100;
            numY = 100;

        }
        respuesta += getValuesNoencontrados(respuesta, ConjuntoY);
        return respuesta;
    }

    public String ConjuntoXUConjuntoYResultado(String posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = posConjuntoX;
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getUnionConjuntoXUY(descripcionX, descripcionY);
        return respuesta;
    }

    public String ConjuntoXUConjuntoY(int posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = MatrizInfo[posConjuntoX][1];
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getUnionConjuntoXUY(descripcionX, descripcionY);
        return respuesta;
    }

    public String ConjuntoXIConjuntoY(int posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = MatrizInfo[posConjuntoX][1];
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getConjuntoXIY(descripcionX, descripcionY);
        return respuesta;
    }

    public String ConjuntoXIConjuntoYResultado(String posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = posConjuntoX;
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getConjuntoXIY(descripcionX, descripcionY);
        return respuesta;
    }

    public String ConjuntoXxConjuntoY(int posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = MatrizInfo[posConjuntoX][1];
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getConjuntoXxY(descripcionX, descripcionY);
        return respuesta;
    }

    public String ConjuntoXxConjuntoYResultado(String posConjuntoX, int posConjuntoY, String[][] MatrizInfo) {
        String respuesta = "";

        String descripcionX = posConjuntoX;
        String descripcionY = MatrizInfo[posConjuntoY][1];
        respuesta = getConjuntoXxY(descripcionX, descripcionY);
        return respuesta;
    }

    public String getConjuntoXIY(String conjuntoX, String ConjuntoY) {
        String respuesta = "";
        String respuestaAux = "";

        conjuntoX = conjuntoX.trim();
        String[] subconjuntosX = conjuntoX.split(";");
        ConjuntoY = ConjuntoY.trim();

        String[] subconjuntosY = ConjuntoY.split(";");
        for (int i = 0; i < subconjuntosX.length; i++) {
            String datoSubconjutoX = subconjuntosX[i];
            datoSubconjutoX = datoSubconjutoX.trim();
            respuestaAux = setAsingarInterseccion(subconjuntosY, datoSubconjutoX);
            numX = 100;
            numY = 100;
            if (!respuestaAux.equals("0")) {
                respuesta += respuestaAux + ";";
            }

        }
        return respuesta;
    }

    public String getConjuntoXxY(String conjuntoX, String ConjuntoY) {
        String respuesta = "";
        String respuestaAux = "";

        conjuntoX = conjuntoX.trim();
        String[] subconjuntosX = conjuntoX.split(";");
        ConjuntoY = ConjuntoY.trim();

        String[] subconjuntosY = ConjuntoY.split(";");
        for (int i = 0; i < subconjuntosX.length; i++) {
            String datoSubconjutoX = subconjuntosX[i];
            datoSubconjutoX = datoSubconjutoX.trim();
            respuestaAux = setAsingarProducto(subconjuntosY, datoSubconjutoX);
            numX = 100;
            numY = 100;
            respuesta += respuestaAux + "\n";

        }
        return respuesta;
    }

}
